package com.ciaojian.worker.meituan.kit;

import com.alibaba.fastjson.JSONObject;
import com.ciaojian.core.model.MeituanToken;
import com.ciaojian.core.util.ApplicationContextHelper;
import com.ciaojian.worker.meituan.MeituanApi;
import com.ciaojian.worker.meituan.enums.SignType;
import com.ciaojian.worker.meituan.mode.Token;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 美团接口工具类
 *
 * @author Atlakyn
 */
@Slf4j
public class MeituanKit {
    private static final String FIELD_SIGN = "sign";

    public static String hmacSha256(String data, String key) {
        return PayKit.hmacSha256(data, key);
    }

    public static String md5(String data) {
        return PayKit.md5(data);
    }

    /**
     * 构建签名
     *
     * @param params     需要签名的参数
     * @param partnerKey 密钥
     * @param signType   签名类型
     * @return 签名后的 Map
     */
    public static Map<String, Object> buildSign(Map<String, Object> params, String partnerKey, SignType signType) throws Exception {
        String sign = createSign(params, signType, partnerKey);
        params.put(FIELD_SIGN, sign);
        return params;
    }

    /**
     * 生成签名
     *
     * @param params   需要签名的参数
     * @param signType 签名类型
     * @param secret   密钥
     * @return 签名后的数据
     */
    public static String createSign(Map<String, Object> params, SignType signType, String secret) throws Exception {
        if (signType == null) {
            signType = SignType.MD5;
        }
        // 生成签名前先去除sign
        params.remove(FIELD_SIGN);
        return PayKit.createLinkString(params, signType, secret);
    }

    /**
     * @Description: 刷新session并且更新数据库
     * @Author: xiangchao
     * @Date: 2020/11/27 4:19 下午
     */
    public static MeituanToken refreshAndGetToken(MeituanToken data) {
        log.info(">>>刷新session并且更新数据库->刷新授权，刷新前的美团 token 信息={}>>>", data);
        Map<String, Object> requestParam = new HashMap<>(4);
        Token token = ApplicationContextHelper.getBean(Token.class);
        // 封装参数
        requestParam.put("app_key", token.getAppKey());
        requestParam.put("app_secret", token.getAppSecret());
        requestParam.put("grant_type", token.getGrantType());
        requestParam.put("refresh_token", data.getRefreshToken());
        // 请求接口
        String result = MeituanApi.token(requestParam);
        // 解析返回数据
        JSONObject jsonObj = JSONObject.parseObject(result);
        data.setAccessToken(jsonObj.getString("access_token"));
        data.setRefreshToken(jsonObj.getString("refresh_token"));
        // 当前时间 + 美团返回的秒数*1000(转成毫秒) - 1800000毫秒(防止请求延迟产生的误差)
        data.setExpiresDate(System.currentTimeMillis() + jsonObj.getLong("expires_in") * 1000 - 1_800_000);
        data.setRemainRefreshCount(jsonObj.getInteger("remain_refresh_count"));
        data.updateById();
        log.info(">>>刷新session并且更新数据库->刷新授权，刷新后的美团 token 信息={}>>>", data);
        return data;
    }
}
